package cz.pecinovsky.česky.oopnz._115_;
//Příliš žluťoučký kůň úpěl ďábelské ódy

import cz.pecinovsky.česky.oopnz._000_.Run;

import cz.pecinovsky.česky.oopnz.správce.Přesouvač;
import cz.pecinovsky.česky.oopnz.správce.SprávcePlátna;

import cz.pecinovsky.česky.oopnz.utility.Barva;

import cz.pecinovsky.česky.oopnz.utility.IO;


// %I+ <120z
//import static cz.pecinovsky.česky.oopnz._115_._116_Auto_119.Auto;
// %I-
import static cz.pecinovsky.česky.oopnz._115_.Auto_120_124.Auto;


////////////////////////////////////////////////////////////////////////////////
//%%+  +++++ Konec ignorovaného počátečního textu +++++
//%X+ xxxxx Začátek přeskakovaného textu xxxxx
/*******************************************************************************
 *<pre>
 * Předchozí:   Není - toto_je_nově_definovaná_třída
 *              Ttt v projektu Ppp
 * Následující: Prozatím není
 *
 * Projekt  Ppp
 *   + Přidáno
 *   - Odebráno
 *   ~ Změněno
 *</pre>
 */
public class AutoTest_117_124
{    private AutoTest_117_124() {}   static
////////////////////////////////////////////////////////////////////////////////
//%X- ----- Konec přeskakovaného textu -----


/*******************************************************************************
 * Testovací třída {@code AutoTest}  slouží ke komplexnímu otestování
 * třídy {@link AutoTest}.
 *
 * @author Rudolf PECINOVSKÝ
 * @version 6.03.2017 — 2010-11-08
 */
public class AutoTest extends junit.framework.TestCase
{
//%X+ <119
    private SprávcePlátna SP;
//%X-
    private Auto auto0;
    private Auto autoXY;
    private Auto autoXYB;
//%X+ <122
    private Auto autoXYM;
    private Auto autoXYMB;
//%X-

//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     * Vytvoří test se zadaným názvem.
     *
     * @param název  Název konstruovaného testu
     */
    public AutoTest( String název )
    {
        super(název);
    }



//== PŘÍPRAVA A ÚKLID PŘÍPRAVKU ================================================

    /***************************************************************************
     * Inicializace předcházející spuštění každého testu a připravující tzv.
     * přípravek (fixture), což je sada objektů, s nimiž budou testy pracovat.
     */
    @Override
    protected void setUp()
    {
        auto0    = new Auto();
        autoXY   = new Auto( 50, 100 );
        autoXYB  = new Auto(150,  25, Barva.ČERNÁ);
//%X+ <122
        autoXYM  = new Auto(200, 100,  64);
        autoXYMB = new Auto(  0, 172, 256, Barva.ČERVENÁ);
//%X-
//%X+ <119

        SP = SprávcePlátna.getInstance();
        SP.přidej(auto0);
        SP.přidej(autoXY);
        SP.přidej(autoXYB);
//%X-
//%X+ <122
        SP.přidej(autoXYM);
        SP.přidej(autoXYMB);
//%X-
        
        IO.zpráva("Auta připravena");
    }


    /***************************************************************************
     * Úklid po testu - tato metoda se spustí po vykonání každého testu.
     */
    @Override
    protected void tearDown()
    {
    }


//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//%X+ <123

    /***************************************************************************
     * Vyzkouší blikání zadaného auta
     */
    private void pomBlikání(Auto auto)
    {
        auto.zhasni();
        IO.čekej(500);
        auto.blikniVlevo();
        IO.čekej(500);
        auto.blikniVpravo();
        IO.čekej(500);
        auto.rozsviť();
    }


    /***************************************************************************
     * Vyzkouší změny pozice a velikosti zadaného auta
     */
    private void pomPoziceVelikost(Auto a)
    {
        final int ms = 500;
        a.setPozice(50, 200);
        IO.čekej(ms);
        a.setModul(200);
        IO.čekej(ms);
        a.setModul(25);
        IO.čekej(ms);
        SP.odstraň(a);
        IO.čekej(ms);
    }

//%X-
//%X+ <123


//%X-
//== INTERNÍ DATOVÉ TYPY =======================================================
//== VLASTNÍ TESTY =============================================================
//
//     /***************************************************************************
//      *
//      */
//     public void testXXX()
//     {
//     }
//
//%X+ <123

    /***************************************************************************
     *
     */
    public void testBlikání()
    {
        pomBlikání(auto0);
        pomBlikání(autoXY);
        pomBlikání(autoXYB);
        pomBlikání(autoXYM);
        pomBlikání(autoXYMB);
    }
//%X-
//%X+ <124


    public void testPlynuléPosuny()
    {
        Přesouvač p = new Přesouvač(10);
        p.přesunNa(150, 150, auto0);
        p.přesunNa(  0, 200, autoXY);
        p.přesunNa(  0,   0, autoXYMB);
        p.přesunNa(150, 236, autoXYB);
        p.přesunNa(  0, 150, autoXYM);
    }
//%X-
//%X+ <123


    public void testPoziceVelikost()
    {
        pomPoziceVelikost(autoXYMB);
        pomPoziceVelikost(autoXYM);
        pomPoziceVelikost(autoXYB);
        pomPoziceVelikost(autoXY);
        pomPoziceVelikost(auto0);
    }
//%X-
//%X+   Metoda připravená k vložení do testovacích tříd
     /** */
     public void testPřípravek() {}
//%X-
}

//%%-  ----- Začátek ignorovaného závěrečného textu -----
////////////////////////////////////////////////////////////////////////////////
//== TESTY A METODA MAIN =======================================================
//Není-li třída testovací, následující dvě metody se smažou


    /***************************************************************************
     * Třída, jejíž instance má na starosti úklid mezi jednotlivými testy,
     * který není možno zakomponovat do metody {@code tearDown()},
     * dokud nebudou studenti umět programovat.
     */
    private static class TearDown implements Run.ITD
    {
        /** {@inheritDoc} */
        @Override
        public void ukliď()
        {
//            Plátno.smažPlátno();
//            SprávcePlátna.getInstance().odstraňVše();
        }
    }


    /***************************************************************************
     * Testovací metoda.
     */
    public static void test()
    {
        Run.tests(AutoTest.class,
                new TearDown(),
//                "testPřípravek",
//                "testBlikání",
//                "testPoziceVelikost",
                "testPlynuléPosuny",
                "");
        System.exit(0);
    }
    /** @param args Parametry příkazového řádku - nepoužívané. */
    public static void main( String[] args )  {  test();  }
}
